package com.lheia.tool

import java.sql.Date
import java.sql.Time
import java.sql.Timestamp
import java.text.SimpleDateFormat

class ToolDateTime {

    static java.util.Date extractDate(String containsDateStr){
        def matchList = ToolString.matchList(containsDateStr,ToolString.regEx_date)
        if(matchList){
            return formatSpiderDate(matchList.get(0))
        }else{
            return null
        }
    }

    static java.util.Date formatSpiderDate(String dateOne){
        if(!dateOne){
            return null
        }
        try{
           return  parseString(dateOne,"YYYY年MM月dd日")
        }catch(Exception e){
            try{
                return parseString(dateOne, "YYYY.MM.dd")
            }catch(Exception e1) {
                try{
                    return parseString(dateOne, "YYYY-MM-dd")
                }catch(Exception e2) {
                    try{
                        return parseString(dateOne, "YYYY/MM/dd")
                    }catch(Exception e3) {
                        try{
                            return parseString(dateOne, "YYYY年MM月dd号")
                        }catch(Exception e4) {
                            try{
                                return parseString(dateOne, "YYYY年MM月dd")
                            }catch(Exception e5) {
                                try{
                                    return parseString(dateOne, "YYYY－MM－dd")
                                }catch(Exception e6) {
                                    try{
                                        return parseString(dateOne, "YYYY/MM/dd")
                                    }catch(Exception e7) {
                                        return null
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }

    }

    /**
     * 把java.util.Date类型的数据转换成java.sql.Date类型的数据。
     * @param utilDate java.util.Date类型的日期。
     * @return 返回转换后的java.sql.Date类型的日期。
     */
     static Date gainDate(java.util.Date dOne)
    {
        return new Date(dOne.getTime());
    }

    /**
     * 把java.util.Date类型的数据转换成java.sql.Time类型的数据。
     * @param utilDate java.util.Date类型的日期。
     * @return 返回转换后的java.sql.Time类型的日期。
     */
     static Time gainTime(java.util.Date dOne)
    {
        return new Time(dOne.getTime());

    }

    /**
     * 把java.util.Date类型的数据转换成java.sql.Timestamp类型的数据。
     * @param utilDate java.util.Date类型的日期。
     * @return 返回转换后的java.sql.Timestamp类型的日期。
     */
     static Timestamp gainDateTime(java.util.Date dOne)
    {
          return new Timestamp(dOne.getTime());

    }

    /**
     * 获取当前日期
     * @return 返回java.sql.Date类型的日期。
     */
     static Date gainDate()
    {
            return ToolDateTime.gainDate(new java.util.Date());

    }

    /**
     * 获取当前时间
     * @return 返回java.sql.Time类型的时间。
     */
     static Time gainTime()
    {

            return ToolDateTime.gainTime(new java.util.Date());

    }

    /**
     * 获取当前日期
     * @return 返回java.sql.Timestamp类型的时间。
     */
     static Timestamp gainDateTime()
    {

            return ToolDateTime.gainDateTime(new java.util.Date());

    }

    /**
     * 获取当前日期中的指定部分或全部
     * @param strFormat 日期的格式化指定。
     * @return 返回格式化java.sql.Date的字符串。
     */
     static String formatDate(String strFormat)
    {

            return ToolDateTime.formatDateTime(ToolDateTime.gainDate(), strFormat);

    }

    /**
     * 获取当前时间中的指定部分或全部
     * @param strFormat 日期的格式化指定。
     * @return 返回格式化java.sql.Time的字符串。
     */
     static String formatTime(String strFormat)
    {
            return ToolDateTime.formatDateTime(ToolDateTime.gainTime(), strFormat);

    }

    /**
     * 获取当前日期中的指定部分或全部
     * @param strFormat 日期的格式化指定。
     * @return 返回格式化java.sql.Timestamp的字符串。
     */
     static String formatDateTime(String strFormat)
    {
            return ToolDateTime.formatDateTime(ToolDateTime.gainDateTime(), strFormat);
    }

    /**
     * 获取日期中的指定部分或全部。<br>
     * 日期中的部分是如下格式的任一种：<br>
     * *yyyy*、*MM*、*dd*、*yyyy*MM*、*MM*dd*、*yyyy*dd*<br>
     * *yyyy*MM*dd*——这种格式中yyyy、MM、dd之间可以任意调换位置。<br>
     * 注意上面各个格式的日期字符串中的*号表示你可以任意输入内容或不写，比如你可以替换为<br>
     * 年、月、日、时、分、秒等等。<br>
     * 如："yyyy-MM-dd HH:mm:ss SSS"
     * @param dOne 日期。
     * @param strFormat 日期的格式化指定。
     * @return 返回制定的日期字符串。
     */
     static String formatDateTime(java.util.Date dOne, String strFormat)
    {
            SimpleDateFormat sdfDatetimeFormat = (SimpleDateFormat) ToolDateTime.datetimeFormat.get(strFormat);
            if (sdfDatetimeFormat == null)
            {
                sdfDatetimeFormat = new SimpleDateFormat(strFormat);
                datetimeFormat.put(strFormat, sdfDatetimeFormat);
            }
            return sdfDatetimeFormat.format(dOne);
    }

    /**
     * 获取日期中的指定部分或全部。<br>
     * 日期中的部分是如下格式的任一种：<br>
     * *yyyy*、*MM*、*dd*、*yyyy*MM*、*MM*dd*、*yyyy*dd*<br>
     * *yyyy*MM*dd*——这种格式中yyyy、MM、dd之间可以任意调换位置。<br>
     * 注意上面各个格式的日期字符串中的*号表示你可以任意输入内容或不写，比如你可以替换为<br>
     * 年、月、日、时、分、秒等等。<br>
     * 如："yyyy-MM-dd HH:mm:ss SSS"
     * @param dOne 日期。
     * @param strFormat 日期的格式化指定。
     * @return 返回制定的日期字符串。
     */
     static String formatDate(Date dOne, String strFormat)
    {
            return ToolDateTime.formatDateTime(dOne, strFormat);
    }

    /**
     * 获取时间中的指定部分或全部。<br>
     * 日期中的部分是如下格式的任一种：<br>
     * *yyyy*、*MM*、*dd*、*yyyy*MM*、*MM*dd*、*yyyy*dd*<br>
     * *yyyy*MM*dd*——这种格式中yyyy、MM、dd之间可以任意调换位置。<br>
     * 注意上面各个格式的日期字符串中的*号表示你可以任意输入内容或不写，比如你可以替换为<br>
     * 年、月、日、时、分、秒等等。<br>
     * 如："yyyy-MM-dd HH:mm:ss SSS"
     * @param dOne 日期。
     * @param strFormat 日期的格式化指定。
     * @return 返回制定的日期字符串。
     */
     static String formatTime(Time dOne, String strFormat)
    {
            return ToolDateTime.formatDateTime(dOne, strFormat);
    }

    /**
     * 获取日期中的指定部分或全部。<br>
     * 日期中的部分是如下格式的任一种：<br>
     * *yyyy*、*MM*、*dd*、*yyyy*MM*、*MM*dd*、*yyyy*dd*<br>
     * *yyyy*MM*dd*——这种格式中yyyy、MM、dd之间可以任意调换位置。<br>
     * 注意上面各个格式的日期字符串中的*号表示你可以任意输入内容或不写，比如你可以替换为<br>
     * 年、月、日、时、分、秒等等。<br>
     * 如："yyyy-MM-dd HH:mm:ss SSS"
     * @param dOne 日期。
     * @param strFormat 日期的格式化指定。
     * @return 返回制定的日期字符串。
     */
     static String formatDateTime(Timestamp dOne, String strFormat)
    {
            return ToolDateTime.formatDateTime((java.util.Date) dOne, strFormat);
    }

    /**
     * 获取日期中的指定部分或全部。<br>
     * 日期中的部分是如下格式的任一种：<br>
     * *yyyy*、*MM*、*dd*、*yyyy*MM*、*MM*dd*、*yyyy*dd*<br>
     * *yyyy*MM*dd*——这种格式中yyyy、MM、dd之间可以任意调换位置。<br>
     * 注意上面各个格式的日期字符串中的*号表示你可以任意输入内容或不写，比如你可以替换为<br>
     * 年、月、日、时、分、秒等等。<br>
     * 如："yyyy-MM-dd HH:mm:ss SSS"
     * @param dOne 日期。
     * @param strFormat 日期的格式化指定。
     * @return 返回指定的日期字符串。
     */
    private static java.util.Date parseString(String strOne, String strFormat)throws Exception
    {
            SimpleDateFormat sdfDatetimeFormat = (SimpleDateFormat) ToolDateTime.datetimeFormat.get(strFormat);
            if (sdfDatetimeFormat == null)
            {
                sdfDatetimeFormat = new SimpleDateFormat(strFormat);
                datetimeFormat.put(strFormat, sdfDatetimeFormat);
            }
            return sdfDatetimeFormat.parse(strOne);

    }

    /**
     * 获取日期中的指定部分或全部。<br>
     * 日期中的部分是如下格式的任一种：<br>
     * *yyyy*、*MM*、*dd*、*yyyy*MM*、*MM*dd*、*yyyy*dd*<br>
     * *yyyy*MM*dd*——这种格式中yyyy、MM、dd之间可以任意调换位置。<br>
     * 注意上面各个格式的日期字符串中的*号表示你可以任意输入内容或不写，比如你可以替换为<br>
     * 年、月、日、时、分、秒等等。<br>
     * 如："yyyy-MM-dd HH:mm:ss SSS"
     * @param dOne 日期。
     * @param strFormat 日期的格式化指定。
     * @return 返回指定的日期字符串。
     */
     static Date parseDate(String strOne, String strFormat)
    {

            return ToolDateTime.gainDate(ToolDateTime.parseString(strOne, strFormat));

    }

    /**
     * 获取时间中的指定部分或全部。<br>
     * 日期中的部分是如下格式的任一种：<br>
     * *yyyy*、*MM*、*dd*、*yyyy*MM*、*MM*dd*、*yyyy*dd*<br>
     * *yyyy*MM*dd*——这种格式中yyyy、MM、dd之间可以任意调换位置。<br>
     * 注意上面各个格式的日期字符串中的*号表示你可以任意输入内容或不写，比如你可以替换为<br>
     * 年、月、日、时、分、秒等等。<br>
     * 如："yyyy-MM-dd HH:mm:ss SSS"
     * @param dOne 日期。
     * @param strFormat 日期的格式化指定。
     * @return 返回指定的时间字符串。
     */
     static Time parseTime(String strOne, String strFormat)
    {

            return ToolDateTime.gainTime(ToolDateTime.parseString(strOne, strFormat));

    }

    /**
     * 获取时间中的指定部分或全部。<br>
     * 日期中的部分是如下格式的任一种：<br>
     * *yyyy*、*MM*、*dd*、*yyyy*MM*、*MM*dd*、*yyyy*dd*<br>
     * *yyyy*MM*dd*——这种格式中yyyy、MM、dd之间可以任意调换位置。<br>
     * 注意上面各个格式的日期字符串中的*号表示你可以任意输入内容或不写，比如你可以替换为<br>
     * 年、月、日、时、分、秒等等。<br>
     * 如："yyyy-MM-dd HH:mm:ss SSS"
     * @param dOne 日期。
     * @param strFormat 日期的格式化指定。
     * @return 返回指定的时间字符串。
     */
     static Timestamp parseDateTime(String strOne, String strFormat)
    {
            return ToolDateTime.gainDateTime(ToolDateTime.parseString(strOne, strFormat))
    }

    /**
     * 返回给定的日期加指定天数后所得到的日期。
     * @param dOne 要处理的日期
     * @param iMonth 对指定的日期要加的天数
     * @return 返回当前日期加指定天数的日期。
     */
     static java.util.Date addMonth(java.util.Date dOne, int iMonth)
    {

            Calendar calOne = Calendar.getInstance();
            calOne.setTime(dOne);
            calOne.add(Calendar.MONTH, iMonth);
            return calOne.getTime();

    }

    /**
     * 返回给定的日期加指定天数后所得到的日期。
     * @param dOne 要处理的日期
     * @param iMonth 对指定的日期要加的天数
     * @return 返回当前日期加指定天数的日期。
     */
     static Date addMonth(Date dOne, int iMonth)
    {

            return ToolDateTime.gainDate(ToolDateTime.addMonth((java.util.Date) dOne, iMonth));
    }

    /**
     * 返回给定的日期加指定天数后所得到的时间。
     * @param dOne 要处理的日期
     * @param iMonth 对指定的日期要加的天数
     * @return 返回当前日期加指定天数的时间。
     */
     static Timestamp addMonth(Timestamp dOne, int iMonth)
    {

            return ToolDateTime.gainDateTime(ToolDateTime.addMonth((java.util.Date) dOne, iMonth));

    }

    /**
     * 返回给定的日期加指定天数后所得到的日期。
     * @param dOne 要处理的日期
     * @param iDay 对指定的日期要加的天数
     * @return 返回当前日期加指定天数的日期。
     */
     static java.util.Date addDay(java.util.Date dOne, int iDay)
    {

            Calendar calOne = Calendar.getInstance();
            calOne.setTime(dOne);
            calOne.add(Calendar.DATE, iDay);
            return calOne.getTime();

    }

    /**
     * 返回给定的日期加指定天数后所得到的日期。
     * @param dOne 要处理的日期
     * @param iDay 对指定的日期要加的天数
     * @return 返回当前日期加指定天数的日期。
     */
     static Date addDay(Date dOne, int iDay)
    {

            return ToolDateTime.gainDate(ToolDateTime.addDay((java.util.Date) dOne, iDay));

    }

    /**
     * 返回给定的日期加指定天数后所得到的时间。
     * @param dOne 要处理的日期
     * @param iDay 对指定的日期要加的天数
     * @return 返回当前日期加指定天数的时间。
     */
     static Timestamp addDay(Timestamp dOne, int iDay)
    {

            return ToolDateTime.gainDateTime(ToolDateTime.addDay((java.util.Date) dOne, iDay));

    }

    /**
     * 返回两个日期之间的间隔分钟
     * @param dOne 日期1
     * @param dTwo 日期2
     * @return 返回间隔分钟
     */
     static long gainDaySpace(java.util.Date dOne, java.util.Date dTwo)
    {
            long lOne = dOne.getTime();
            long lTwo = dTwo.getTime();
            return (lTwo - lOne) / 1000 / 60 / 60 / 24;
    }

    /**
     * 返回两个日期之间的间隔分钟
     * @param dOne 日期1
     * @param dTwo 日期2
     * @return 返回间隔分钟
     */
     static long gainDaySpace(Date dOne, Date dTwo)
    {

            return ToolDateTime.gainDaySpace((java.util.Date) dOne, (java.util.Date) dTwo);

    }

    /**
     * 返回两个日期之间的间隔分钟
     * @param dOne 时间1
     * @param dTwo 时间2
     * @return 返回间隔分钟
     */
     static long gainDaySpace(Timestamp dOne, Timestamp dTwo)
    {

            return ToolDateTime.gainDaySpace((java.util.Date) dOne, (java.util.Date) dTwo);

    }

    /**
     * 返回给定的日期加指定天数后所得到的日期。
     * @param dOne 要处理的日期
     * @param iDay 对指定的日期要加的天数
     * @return 返回当前日期加指定天数的日期。
     */
     static java.util.Date addMinute(java.util.Date dOne, int iMinute)
    {

            Calendar calOne = Calendar.getInstance();
            calOne.setTime(dOne);
            calOne.add(Calendar.MINUTE, iMinute);
            return calOne.getTime();

    }

    /**
     * 返回给定的日期加指定天数后所得到的日期。
     * @param dOne 要处理的日期
     * @param iDay 对指定的日期要加的天数
     * @return 返回当前日期加指定天数的日期。
     */
     static Date addMinute(Date dOne, int iMinute)
    {

            return ToolDateTime.gainDate(ToolDateTime.addMinute((java.util.Date) dOne, iMinute));

    }

    /**
     * 返回给定的日期加指定天数后所得到的时间。
     * @param dOne 要处理的日期
     * @param iDay 对指定的日期要加的天数
     * @return 返回当前日期加指定天数的时间。
     */
     static Timestamp addMinute(Timestamp dOne, int iMinute)
    {

            return ToolDateTime.gainDateTime(ToolDateTime.addMinute((java.util.Date) dOne, iMinute));

    }

    /**
     * 返回两个日期之间的间隔分钟
     * @param dOne 日期1
     * @param dTwo 日期2
     * @return 返回间隔分钟
     */
    static long gainMinusSpace(java.util.Date dOne, java.util.Date dTwo)
    {

            long lOne = dOne.getTime();
            long lTwo = dTwo.getTime();

            return (lTwo - lOne) / 1000 / 60;

    }

    /**
     * 返回两个日期之间的间隔分钟
     * @param dOne 日期1
     * @param dTwo 日期2
     * @return 返回间隔分钟
     */
     static long gainMinusSpace(Date dOne, Date dTwo)
    {

            return ToolDateTime.gainMinusSpace((java.util.Date) dOne, (java.util.Date) dTwo);

    }

    /**
     * 返回两个日期之间的间隔分钟
     * @param dOne 时间1
     * @param dTwo 时间2
     * @return 返回间隔分钟
     */
     static long gainMinusSpace(Timestamp dOne, Timestamp dTwo)
    {


            return ToolDateTime.gainMinusSpace((java.util.Date) dOne, (java.util.Date) dTwo);

    }

    /**
     * @param 要转换的毫秒数
     * @return 该毫秒数转换为 * days * hours * minutes * seconds 后的格式
     * @author fy.zhang
     */
     static Map formatMillisecond(long millisecond)
    {

            long days = millisecond / (1000 * 60 * 60 * 24);
            long hours = (millisecond % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60);
            long minutes = (millisecond % (1000 * 60 * 60)) / (1000 * 60);
            long seconds = (millisecond % (1000 * 60)) / 1000;
            HashMap hm = new HashMap();
            hm.put("day", days);
            hm.put("hour", hours);
            hm.put("minute", minutes);
            hm.put("second", seconds);

            return hm;

    }

    // 获取当年的第一天
     static Timestamp getYearFirst(int year)
    {
        Calendar calendar = Calendar.getInstance();
        calendar.clear();
        calendar.set(Calendar.YEAR, year);
        java.util.Date currYearFirst = calendar.getTime();
        return new Timestamp(currYearFirst.getTime());
    }

    // 获取当年的最后一天
     static Timestamp getYearLast(int year)
    {
        Calendar calendar = Calendar.getInstance();
        calendar.clear();
        calendar.set(Calendar.YEAR, year);
        calendar.roll(Calendar.DAY_OF_YEAR, -1);
        java.util.Date currYearLast = calendar.getTime();
        return new Timestamp(currYearLast.getTime());
    }

    /**
     * 时间格式
     */
    private static Map datetimeFormat = new HashMap();
}
